/* 使用示例

```dataviewjs
dv.view('dida365TaskTable', {
    folderPath: "9.Archive/Dida365/Tasks",
    condition: (p, c) => {
        return p.frontmatter?.column_id === c.frontmatter?.column_id;
    }
});
```

```dataviewjs
dv.view('dida365TaskTable', {
    folderPath: "9.Archive/Dida365/Tasks",
    condition: (p, c) => {
        return p.frontmatter?.task_id === c.frontmatter?.parent_id
;
    }
});
```

*/


/** @type {object} 默认配置 */
const defaultOpt = {
  folderPath: '"Project"', // 默认文件夹路径
  condition: (pf, cf) => true, // 默认无条件筛选
  priorityMap: {
    5: "🔥", 
    3: "❗", 
    1: "⏬", 
    0: "😐"
  },
  statusMap: {
    2: "✅",
    0: "⏳"
  },
  dateFormat: "yyyy-MM-dd", // 日期格式
  columns: ["标题", "优先级", "时间范围", "状态", "完成时间"] // 表格列
}

/** @type {object} 最终配置 */
const opt = Object.assign({}, defaultOpt, input ? input : {})

// 获取当前笔记信息
const currentFile = dv.current().file;

// 格式化日期函数
function formatDate(dateString) {
    if (!dateString) return "";
    const normalize = v => {
        if (!v) return null;
        const str = String(v);
        const m = str.match(/^(\d{4}-\d{2}-\d{2})/);
        return m ? m[1] : null;
    };
    const dateStr = normalize(dateString);

    // 用 dv.date 把字符串转成 Luxon DateTime
    const dt = dv.date(dateStr);
    if (!dt || !dt.isValid) return "";
    // 返回 "yyyy-MM-dd" 格式
    return dt.toFormat(opt.dateFormat);
}

// 格式化时间范围函数
function formatDateRange(startDate, endDate) {
    const formattedStart = formatDate(startDate);
    const formattedEnd = formatDate(endDate);
    
    if (formattedStart && formattedEnd) {
        if (formattedStart === formattedEnd) {
            return `📅 ${formattedEnd}`;
        }
        return `🛫 ${formattedStart} </br>~</br>📅 ${formattedEnd}`;
    } else if (formattedStart) {
        return `🛫 ${formattedStart}`;
    } else if (formattedEnd) {
        return `📅 ${formattedEnd}`;
    }
    return "未设置";
}

// 使用传入的筛选条件获取相关笔记
let relatedNotes = dv.pages(`"${opt.folderPath}"`);

// 应用自定义条件
if (typeof opt.condition === 'function') {
    relatedNotes = relatedNotes.where(p => opt.condition(p.file, currentFile));
}

// 没有找到相关笔记
if (relatedNotes.length === 0) {
    dv.paragraph(`ℹ️ 未找到符合条件的笔记`);
}

// 处理并排序笔记 —— 新：保存排序后的笔记对象
const sortedNotesObjects = relatedNotes
  .map(p => {
    const fm = p.file.frontmatter;
    p.sortWeight = fm?.due_date
      ? formatDate(fm.due_date)
      : `${9 - (fm?.priority ?? 0)}_${p.file.name}`;
    return p;
  })
  .sort(p => p.sortWeight, 'asc');

// 再基于 sortedNotesObjects 生成单元格数组
const sortedNotes = sortedNotesObjects
  .map(p => {
    const fm = p.file.frontmatter;
    const statusValue = fm?.status ?? 0;
    const statusText  = opt.statusMap[statusValue] || '未知';
    const completedTime = statusValue === 2 ? formatDate(fm?.completed_time) : '';

    return [
      `<div style="text-align:left">${fm?.title || p.file.name}</div>`,
      `<div style="text-align:center">${opt.priorityMap[fm?.priority ?? 0] || '未知'}</div>`,
      `<div style="text-align:center">${formatDateRange(fm?.start_date, fm?.due_date)}</div>`,
      `<div style="text-align:center">${statusText}</div>`,
      `<div style="text-align:center">${completedTime}</div>`
    ];
  });

// ------------- 工具：生成 Obsidian 打开链接 -------------
function obsidianOpenLink(path) {
    // 空格、中文等特殊字符需要 encodeURIComponent
    return `obsidian://open?file=${encodeURIComponent(path)}`;
}

// ---------- 1. 计算列宽 ----------
// 第一列留空，其余列按表头文字长度简单估算一个 px 值（可再调）
const colWidths = opt.columns.map((h, i) => {
  if (i === 0) return '';                // 第一列留空，让它自动占剩余
  // 按每个汉字 20px、英文 8px 粗算，可自行调整
  const w = [...h].reduce((s, c) => s + (/[\u4e00-\u9fa5]/.test(c) ? 30 : 10), 0);
  return `${Math.max(w, 80)}px`;        // 最小 60px
});

// ---------- 2. 构造 <colgroup> ----------
const colGroup = colWidths
  .map((w, idx) => {
    // 第三列（索引 2）额外 +80px
    if (idx === 2 && w) w = `${parseFloat(w) + 40}px`;
    return w
      ? `<col style="width:${w}; min-width:${w};">`
      : '<col style="width:100%;">';
  })
  .join('');


// ---------- 3. 构造表头 ----------
const tableHeaders = opt.columns.map((header, index) => {
  const alignStyle = index === 0 ? "text-align: left" : "text-align: center";
  return `<th style="${alignStyle}">${header}</th>`;
}).join('');

// ---------- 4. 构造行 ----------
// ------------- 重新构造行：整行可点击 -------------
const tableRows = sortedNotes
  .map((row, idx) => {
    const notePath = sortedNotesObjects[idx].file.path;
    const cellsHtml = row
      .map((cell, colIdx) => {
        const alignStyle = colIdx === 0 ? 'text-align:left' : 'text-align:center';
        return `<td style="vertical-align:middle; ${alignStyle}; padding:4px 6px;">${cell}</td>`;
      })
      .join('');

    return `
<tr style="border:none;">
  <td colspan="${opt.columns.length}" style="padding:0; border:none;">
    <a href="${obsidianOpenLink(notePath)}"
       style="display:block; text-decoration:none; color:inherit;">
      <table style="width:100%; table-layout:fixed; border-collapse:collapse; border:none; margin:0;">
        <colgroup>${colGroup}</colgroup>
        <tbody><tr>${cellsHtml}</tr></tbody>
      </table>
    </a>
  </td>
</tr>`;
  })
  .join('');

// ---------- 5. 最终 HTML ----------
const tableHTML = `
<table style="table-layout: fixed; width: 100%; border-collapse:collapse;" class="centered-dv-table">
  <colgroup>${colGroup}</colgroup>
  <thead>
    <tr>${tableHeaders}</tr>
  </thead>
  <tbody>
    ${tableRows}
  </tbody>
</table>

<p>总计: ${sortedNotes.length} 个任务</p>`;

// ---------- 6. 显示 ----------
dv.span(tableHTML);